package com.example.javamaday.graph;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 加权无向图的实现
 */
public class EdgeWeightedGraph {

    private final int v;  // 顶点数

    private int e;  // 边的总数

    private ConcurrentLinkedQueue<Edge>[] adj;

    public EdgeWeightedGraph(int v) {
        this.v = v;
        this.e = 0;
        this.adj = new ConcurrentLinkedQueue[v];
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new ConcurrentLinkedQueue();
        }
    }

    // 获取顶点的数量
    public int V() {
        return v;
    }

    // 获取边的数量
    public int E() {
        return e;
    }

    // 向加权无向图中添加一条边
    public void addEdge(Edge edge) {
        int v = edge.either();
        int w = edge.other(v);
        adj[v].add(edge);
        adj[w].add(edge);
        e++;
    }

    // 获取顶点v相关联的所有边
    public Queue<Edge> adj(int v) {
        return adj[v];
    }

    public Queue<Edge> edges() {
        Queue<Edge> allEdges = new ConcurrentLinkedQueue<>();

        for (int i = 0; i < this.v; i++) {
            for (Edge e : adj[i]) {
                if (e.other(v) < v) {
                    allEdges.add(e);
                }
            }
        }
        return allEdges;
    }
}
